package controllers

import (
	"Bok/models"
	"Bok/services"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
)

type ArticleController struct {
	articleService services.ArticalService
}

// GO 的工厂函数，用于创建 controller 容器，传递 serverice 容器

func NewArticleController(service services.ArticalService) *ArticleController {
	return &ArticleController{
		articleService: service,
	}
}

// CreateArticle  创建文章
// @Summary 创建文章
// @Tags 文章管理
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Param article body models.CreateArticleRequest true "文章信息"
// @Success 201 {object} models.Article
// @Router /api/admin/articles [post]
func (c *ArticleController) CreateArticle(ctx *gin.Context) {
	var req models.CreateArticleRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"参数错误": err.Error()})
		return
	}
	// 从认证中间件中获取用户ID
	//userID, exists := ctx.Get("userID")
	//if !exists {
	//	ctx.JSON(http.StatusUnauthorized, gin.H{"error": "未授权"})
	//	return
	//}
	article, err := c.articleService.CreateArtical(req, 1)

	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusCreated, article)
}

// GetArticle 获取文章详情
// @Summary 获取文章详情
// @Tags 文章管理
// @Produce json
// @Param id path int true "文章ID"
// @Success 200 {object} models.Article
// @Router /api/articles/{id} [get]
func (c *ArticleController) GetArticle(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"无效的文章ID": err.Error()})
	}
	article, err := c.articleService.GetArticalById(uint(id))
	if err != nil {
		ctx.JSON(http.StatusNotFound, gin.H{"error": "文章不存在"})
		return
	}
	ctx.JSON(http.StatusOK, article)
}

// UpdateArticle 更新文章
// @Summary 更新文章
// @Tags 文章管理
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Param id path int true "文章ID"
// @Param article body models.CreateArticleRequest true "文章信息"
// @Success 200 {object} models.Article
// @Router /api/admin/articles/{id} [put]
func (c *ArticleController) UpdateArticle(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的文章ID"})
		return
	}
	var req models.CreateArticleRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "参数错误: " + err.Error()})
		return
	}
	article, err := c.articleService.UpdateArticle(uint(id), req)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, article)
}

// DeleteArticle 删除文章
// @Summary 删除文章
// @Tags 文章管理
// @Security ApiKeyAuth
// @Produce json
// @Param id path int true "文章ID"
// @Success 204
// @Router /api/admin/articles/{id} [delete]
func (c *ArticleController) DeleteArticle(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 64)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的文章ID"})
		return
	}
	err = c.articleService.DeleteArticle(uint(id))
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusNoContent, nil)
}
